/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.siagefi.mb;

import br.com.caelum.stella.bean.validation.CPF;
import br.siagefi.enuns.UnidadesFederativas;
import br.siagefi.model.Funcionario;
import br.siagefi.model.Perfil;
import br.siagefi.model.Usuario;
import br.siagefi.service.FuncionarioService;
import br.siagefi.service.PerfilService;
import br.siagefi.service.UsuarioService;
import br.siagefi.util.FacesUtil;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

/**
 *
 * @author Paulo Lavarini
 */
@SessionScoped
@ManagedBean
public class FuncionarioBean implements Serializable {

    private Funcionario funcionario;
    private List<Funcionario> funcionarios;
    private final FuncionarioService service;
    private String matricula;
    boolean usuarioAtivo;

    @CPF(message = "CPF invalido!")
    private String cpf;
    

    public FuncionarioBean() {
        this.service = new FuncionarioService();
        this.funcionarios = new ArrayList<>();
        this.funcionario = new Funcionario();
        this.usuarioAtivo = false;
        this.getFuncionario().getUsuario().setIsAtivo(this.isUsuarioAtivo());
    }

    // navegação
    
    //template
    public String gerenciarFuncionario(){
         FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove("funcionarioBean");
        return "/pages/users/administrador/funcionario";
    }
    
    public String novo() {
        if (this.getCpf().isEmpty()) {
            FacesUtil.addErrorMessage("Informe o CPF");
            return "funcionario";
        } else {
            this.getFuncionario().setCpf(this.getCpf());
        }
        if (service.jaExiste(this.getFuncionario())) {
            FacesUtil.addErrorMessage("funcionario já cadastrado!");
            return "funcionario";
        }
        return "incluirFuncionario";
    }

    public String alterarFuncionario(Funcionario funcionario) {
        if(funcionario.getUsuario().isAtivo()){
             this.setUsuarioAtivo(false);
        }else {
            this.setUsuarioAtivo(true);
        }
        this.setFuncionario(funcionario);
        return "consultarFuncionario";
    }

    public String voltarParafuncionario() {
        this.limpar();
        return "funcionario";
    }

    public String limpar() {
        this.setMatricula(new String());
        this.setCpf(new String());
        this.setFuncionario(new Funcionario());
        this.setFuncionarios(new ArrayList<Funcionario>());
        this.setUsuarioAtivo(false);
        this.getFuncionario().getUsuario().setIsAtivo(this.isUsuarioAtivo());
        return "funcionario";
    }

    public String encerrar() {
        this.limpar();
        return "index";
    }

    // persistência
  
    public String gravarFuncionario() {
        if (this.getFuncionario().getId() == null) {
            //incluir
            if (service.jaExiste(this.getFuncionario())) {
                FacesUtil.addErrorMessage("Funcionario já cadastrado.");
            } else {
                this.incluirPerfil();
                service.inserir(this.getFuncionario());
                FacesUtil.addSuccessMessage("Funcionario cadastrado com sucesso!");
            }
        } else {
            //alterar
            this.alterarPerfil();
            service.alterar(this.getFuncionario());
            FacesUtil.addSuccessMessage("Dados alterados com sucesso!");
        }
        this.limpar();
        return "funcionario";

    }

    public String removerFuncionario(Funcionario funcionario) {
        if (service.existeDocumentoVinculado(funcionario)) {
            FacesUtil.addErrorMessage("Funcionario possui documentos vinculados. Exclusão não permitida.");
            return "funcionario";
        }
        service.remover(funcionario);
        FacesUtil.addSuccessMessage("Dados excluidos com sucesso!");
        this.limpar();
        return "funcionario";
    }

    public String consultar() {
        if (this.getCpf().isEmpty()) {
            if(this.getMatricula().isEmpty()){
                FacesUtil.addErrorMessage("Informe o CPF ou a Matrícula do Funcionário.");
                return "funcionario";
            }else {
                this.consultaPorMatricula(this.getMatricula());
            }
        }else {
            this.consultaPorCPF(this.getCpf());
        }
        if (this.getFuncionario() == null) {
            FacesUtil.addErrorMessage("Não foram localizados funcionários para o tipo de pesquisa.");
        }else {
            if(this.getFuncionario().getUsuario().isAtivo()){
                this.setUsuarioAtivo(true);
            }
            return "consultarFuncionario";
        }
        return "funcionario";
    }

    public void consultaPorCPF(String cpf) {
        this.setFuncionario(service.listarPorCPF(cpf));
    }
    
    public void consultaPorMatricula(String matricula) {
        this.setFuncionario(service.listarPorMatricula(matricula));
    }

    public String listarfuncionarios() {
        this.limpar();
        this.setFuncionarios(service.listar());
        if (this.getFuncionarios().isEmpty()) {
            FacesUtil.addErrorMessage("Não foram localizados funcionarios para o tipo de pesquisa");
        }else {
            return "funcionario";
        }
        this.limpar();
        return "funcionario";
    }
    
    public String cadastrarPerfil(){
        this.setUsuarioAtivo(true);
        this.getFuncionario().getUsuario().setIsAtivo(true);
        this.getFuncionario().getUsuario().setLogin(this.getFuncionario().getMatricula());
        return "incluirfuncionario";
    }
    
    public void incluirPerfil(){
        if(this.getFuncionario().getUsuario().getPerfil() == null){
            this.getFuncionario().getUsuario().setIsAtivo(false);
        }
        service.incluirUsuario(this.getFuncionario().getUsuario());
    }
    
    public void alterarPerfil(){
        service.alterarUsuario(this.getFuncionario().getUsuario());
    }
    
    // listas e outros dados
    
    public List<UnidadesFederativas> getUnidadesFederativas() {
        return Arrays.asList(UnidadesFederativas.values());
    }
    
    public List<Perfil> getPerfis(){
         return new PerfilService().listar();
    }
    
    public Date getDataAtual(){
        return new GregorianCalendar().getInstance().getTime();
    }

    // getters e setters

    public Funcionario getFuncionario() {
        return funcionario;
    }

    public void setFuncionario(Funcionario funcionario) {
        this.funcionario = funcionario;
    }

    public List<Funcionario> getFuncionarios() {
        return funcionarios;
    }

    public void setFuncionarios(List<Funcionario> funcionarios) {
        this.funcionarios = funcionarios;
    }

    public String getCpf() {
        return cpf;
    }

    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

    public String getMatricula() {
        return matricula;
    }

    public void setMatricula(String matricula) {
        this.matricula = matricula;
    }

    public boolean isUsuarioAtivo() {
        return usuarioAtivo;
    }

    public void setUsuarioAtivo(boolean usuarioAtivo) {
        this.usuarioAtivo = usuarioAtivo;
    }

    

}
